블로그
카테고리 이동
[금융 파이썬 #4-2] 시계열 데이터와 정상성(Stationarity)
2024. 7. 29. 10:00
저번 글에는 시계열 데이터 에 머신러닝, 딥러닝 모델 을 쓰려고 할 때, 데이터의 정상성 확보가 필요한지 알아보았다.
그럼 이번에는 정상성 에 대해서 제대로 알아보도록 하자.
↓ 금융 시계열 데이터로 머신러닝, 딥러닝 모델 쓸 때 정상성 체크가 필요해? ↓
01: 정상성(Stationarity)이란?
정상성 이라는 단어, 참 어렵다. 사실 이 정상성 이라는 단어 는 '정상' 또는 'Normal'과는 하등의 관계가 없다.
그보 다는 정상성(Stationarity) 은 시계열 의 평균과 분산이 일정하고, 특정한 추세가 존재하지 않는 성질 을 말한다.
즉, 시점과 무관하게 과거, 현재, 미래의 분포가 같으며(시간에 독립적), 시계열 데이터 의 확률적 성질이 시간에 따라 변화하지 않음 을 말한다.
정상성은 그 뜻이 아니라구!
어... 그러니 까 강한 정상성 에서 는 X의 분포가 시간에 따라 변화하지 않는다 는 것을 의미한다.
하지만 이런 특징을 구현하기도 어려울 뿐더러, 이러한 특징을 가지고 있는지 시험하기도 어렵다.
그래서 우리 는 정상성 이라고 하면 주로 아래의 약한 정상성 을 의미하곤 한다.
2. 약한 정상성(약정상성): 평균과 분산이 시간에 따라 일정하며, 자기공분산은 시간 간격에만 의존한다.
앞서 서 강한 정상성 은 전체 분포의 시간에 따른 일정함을 말했었다면, 약한 정상성 은 처음 분포와 자기공분산 함수만 제한 된다고 보면 되겠다.
그럼 이제 이 러한 정상성 을 확인하는 방법에 대해 알아보도록 하자
02: 정상성을 확인하는 방법(1) - 시각적 방법
데이터의 정상성 을 확인하는 방법에는 크게 두 가지가 있는데, 그 중에서 먼저 '시각적 방법' 에 대해 알아보도록 하자.
시각적으로 정상성 을 확인하는 방법에는 총 3가지가 있다.
1. 시계열 그래프 분석: 주요 계절성, 추세, 분산 변화를 체크해서, 규칙성 또는 추세가 없을 경우 정상성 을 가지고 있다 고 판단한다.
아래의 그림에서 평균과 분산이 시간에 따라 변동하는지를 체크해보면 (a)가 약한 정상성 을 지니고 있음을 알 수 있겠다.
일반적인 그래프 / 출처: Time Series Analysis and Modeling to Forecast - a Survey
2. Rolling 그래프 확인: 시간에 따른 실시간 평균과 분산 값을 확인할 수 있는 Rolling 그래프 를 그려서 확인한다.
좀 더 정제된 그래프가 주어지므로 판단이 좀 더 쉬워진다. (a)와 (b) 모두 그래프 원본보다 오른쪽의 Rolling 그래프를 볼 때 좀 더 판단이 쉽다.
Rolling Graph / 출처: Time Series Analysis and Modeling to Forecast - a Survey
3. 상관도(Correlogram)와 공분산도(Covariogram) 확인: 상관도와 공분산도 값의 동일여부 를 체크하여 시간적 종속성을 확인할 수 있다.
상관도는 자기상관함수(ACF)의 그래프이며, 공분산도는 자기분산의 그래프라고 보면 된다. 식은 아래와 같다.
위 두 식에서 주목할 점은, 만약 데이터의 정상성 이 확보되어 있다면 V(Xt) = V(Xt+h) 즉 두 식이 같은 표현이 된다 는 점이다.
그래서 데이터가 정상성 을 갖추고 있다면, 상관도와 공분산도는 같은 표현을 보여주어야 한다.
아래의 그래프를 보면 (a)와 (b) 모두 상관도(x)와 공분산도(△)가 일치하게 움직이지 않기 때문에 정상성 을 갖추었다라고 할 수 없다.
상관도(Correlogram)과 공분산도(Covariogram) / 출처: Time Series Analysis and Modeling to Forecast - a Survey
03: 정상성을 확인하는 방법(2): 통계적 방법
통계적으로 정상성을 확인하는 방법으로는 귀무가설 과 대립가설 을 설정한 후, 이 사건이 우연히 발생할 확률(P value) 가 5%보다 크냐 작냐에 따라 귀무가설 혹은 대립가설 을 채택하여 정상성 여부를 판별하는 방법이다.
어... 좀 더 자세하게 설명해보자...
먼저, 각 단어에 대한 설명부터 간단하게 해보자.
H0 참 | H0 거짓 | |
H0 채택 | 옳은 결정 (확률: 1-α) | 제2종 오류 (확률: β) |
H0 기각 | 제1종 오류 (확률: α) | 옳은 결정 (확률: 1-β) |
① 귀무가설 (The Null Hypothesis, H0): 만약 증거가 없다면 사실이라고 판별할 가설 (대립가설 과 상반된 가설)
② 대립가설 (The Alternative Hypothesis, H1): 연구의 대상
③ 유의확률 (P value): 어떤 사건(대립가설)이 우연히 발생할 확률
→ 예를 들어 P value 가 0.05보다 작다면, 해당 사건이 우연히 일어날 확률이 5%보다 작으므로 인과관계에 의해 일어날 가능성이 크며, 이에 귀무가설 (우연히 발생됨)을 기각하고 대립가설 (인과관계에 따라 발생)을 채택한다.
이렇게 통계적으로 데이터의 정상성을 확인하는 방법에는 주파수 검정 과 단위근 검정 등 여러가지가 있는데, 주기가 서로 다른 파동을 분해하는 주파수 검정은 어렵기도 하고 데이터 빈도가 달라지면 못 쓰는 경우가 있어서, 주로 ' 단위근 검정 '을 많이 활용 한다.
여기서 단위근 이란 시계열에서 비정상성을 야기하는 추세 등의 확률적 프로세스 feature로서, 단위근 검정 은 시계열 데이터 가 단위근 을 포함하는지를 검정함으로서 정상성 을 갖춘 시계열 데이터 인지를 판단 한다.
주로 사용하는 단위근 검정 의 종류에는 'KPSS 검정' 과 'ADF 검정' 이 있다.
1. KPSS 검정 은 ' 시계열 데이터 가 정상적이다'가 귀무가설 이기에, P Value 가 0.05보다 크면 대립가설 기각 및 귀무가설 을 채택하며 데이터가 정상적이라 판단한다.
2. 반대로 ADF 검정 은 ' 시계열 데이터 에 단위근이 있다'가 귀무가설 이기에, P Value 가 0.05보다 작으면 귀무가설 기각 및 대립가설 을 채택하며 데이터가 정상적이라 판단한다.
KPSS 검정 와 ADF 검정 은 서로 다른 귀무가설 을 가지고 있기에, 검정할 때 헷갈리면 안된다.
물론 P Value 검정의 기준을 0.05가 아닌 다른 숫자로 둘 수도 있다. 주로 제약과 같이 엄격한 검정이 필요한 경우에 0.01을 기준으로 하며 상황에 따라 조정하여 사용하면 되겠다.
04: 정상성을 확인하는 방법(3) - Python 실습
파이썬으로 실제 시계열 데이터 를 불러와서 정상성 을 확인해보자.
사용한 데이터는 WTI 일일 종가이며, yfinance 라이브러리로 2021년 1월 1일부터 2023년 12월 31일까지의 데이터를 불러와 사용하였다.
- 시각적 방법 - 시계열 그래프 확인
matplotlib 라이브러리를 통해 그래프를 그려서 확인한다.
아래의 오른쪽 그래프를 보면 시간에 따라 가격 추세가 달라짐을 알 수 있다. 즉, 정상성 을 갖추지 못한 것이다.
2. 시각적 방법 - Rolling 그래프 확인
만약 일반적인 시계열 그래프로 확인이 힘들다면, Rolling method를 통해 평균과 분산의 Rolling 그래프를 그려서 좀 더 쉽게 확인할 수 있겠다.
아래 오른쪽 그래프를 보면 시간에 따라 평균과 분산이 변동됨을 알 수 있다. 정상성 의 조건을 갖추지 못한다.
3. 시각적 방법 - 상관도(Correlogram)와 공분산도(Covariogram) 확인
자기상관계수는 statsmodels 라이브러리에서 acf method를 통해 확인할 수 있다. 공분산값은 공분산을 구하는 식을 코드로 구현하여 직접 계산할 수 있도록 하였다.
자기상관계수와 공분산값만 구하면 동일하게 matplotlib 라이브러리로 상관도와 공분산도를 그려서 값을 비교하면 되겠다.
아래의 두번째 그림을 보면 상관도와 공분산도가 일치하지 않으므로, 데이터는 정상성 특징을 갖추지 못한다고 할 수 있다.
4. 통계적 방법 - ADF 검정 과 KPSS 검정
위에서 설명했던 것처럼 통계적으로 정상성을 확인하는 대표적인 방법에는 ADF 검정 과 KPSS 검정 이 있다.
둘 다 statsmodels 라이브러리에서 adfuller, kpss method를 불러와서 간편하게 사용할 수 있다. 검정이라길래 코드가 길 줄 알았는데 그냥 method만 사용하면 되어서 허무한 느낌도 든다. ㅎㅎ
먼저 ADF 검정 은 ' 시계열 데이터 에 단위근이 있다.'가 귀무가설이기에, 정상성 을 확인하려면 귀무가설 을 기각해야 한다.
하지만 WTI 시계열 데이터의 p값 은 0.20이 나왔으며, 0.05를 한참 초과하기에 대립가설 을 기각하고 귀무가설 을 채택해야 한다.
즉, 검정에 사용한 WTI 시계열 데이터 는 정상성 을 갖추지 못했다.
KPSS 검정 은 반대로 귀무가설 이 ' 시계열 데이터 에 단위근이 없다.'이다. 그래서 정상성 을 확인하려면 귀무가설 을 채택해야 한다.
하지만 여기서 p값 이 0.01로 기준값인 0.05보다 하회하기 때문에, 귀무가설 을 기각하고 대립가설 을 채택한다.
즉, 시계열 데이터 에는 단위근이 있고, 이에 따라 정상성 을 갖추지 못한다.
이렇게 시계열 데이터 에서 정상성 을 확인하는 여러가지 방법을 알아보았다.
시계열 데이터 에 정상성 을 확보하지 못하면 어떻게 될까? ARIMA와 같이 자기회귀모형을 사용하는 모델을 사용하지 못한다.
(시계열 데이터의 추세가 이리저리 바뀌는데 자기회귀모형이 이를 예측할 수 있을리가 없다.)
그래서 필요하다면 시계열 데이터 가 정상성 을 확보할 수 있도록 비정상 요소를 분해하고 차분을 해야할 필요 가 있다.
다음에는 시계열 분해와 차분에 대해서 알아보자.